package com.jsb.laundry.common.utils.baidu;

import com.alibaba.fastjson.JSONObject;
import com.jsb.laundry.common.utils.http.HttpUtil;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

/**
 * 计算两经纬度间距离
 * 百度位置api获取经纬度
 *
 * @data 2023/3/13 11:49
 */
public class CalLngLatUtil {

    private static final double EARTH_RADIUS = 6371.0; // 地球半径，单位为公里

    // 百度位置api key
    private static final String BAIDU_AK = "eF1Sh9LAP0SFr8lXta0w6DPeqjFi5MUn";

    /**
     * 计算两个经纬度之间的距离(维度(小)，经度(大))（单位：千米）
     * 我国：lng:经度(大)，lat:维度(小)
     */
    public static double getDistance(double lat1, double lon1, double lat2, double lon2) {
        double dLat = Math.toRadians(lat2 - lat1);
        double dLon = Math.toRadians(lon2 - lon1);
        double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
                + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2))
                * Math.sin(dLon / 2) * Math.sin(dLon / 2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        double distance = EARTH_RADIUS * c;
        return distance;
    }

    /**
     * 根据地址获取经纬度(百度位置api获取经纬度)
     * "维度,经度"
     * 我国：lng:经度(大)，lat:维度(小)
     */
    public static String getLngLat(String address) {
        String url = null;
        try {
             url = String.format("http://api.map.baidu.com/geocoding/v3/?address=%s&output=json&ak=%s", URLEncoder.encode(address, "UTF-8"), BAIDU_AK);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
        String s = HttpUtil.sendGet(url, null, null, null);
        JSONObject jsonObject = JSONObject.parseObject(s);
        JSONObject location = jsonObject.getJSONObject("result").getJSONObject("location");
        // 我国：lng:经度(大)，lat:维度(小)[按 维度(lat),经度(lng)]存入数据库
        String lng = location.getString("lng"), lat = location.getString("lat");
        return lat + "," + lng;
    }

    /**
     * 根据经纬度获取详细地址
     * 我国：lng:经度(大)，lat:维度(小)
     *
     * @param lat 纬度
     * @param lng 经度
     * @return
     */
    private static String getAddressByXY(String lat, String lng) {
        String location = lat + "," + lng; //纬度,经度
        String url = String.format("http://api.map.baidu.com/reverse_geocoding/v3/?ak=%s&output=json&coordtype=wgs84ll&location=%s", BAIDU_AK, location);
        String s = HttpUtil.sendGet(url, null, null, null);
        JSONObject jsonObject = JSONObject.parseObject(s);
        return jsonObject.toJSONString();
    }

    public static void main(String[] args) {
        JSONObject obj = new JSONObject();
        obj.put("ak", "eF1Sh9LAP0SFr8lXta0w6DPeqjFi5MUn");
        obj.put("output", "json");
        obj.put("output", "json");
        obj.put("coordtype", "wgs84ll");
        obj.put("location", "31.351837,121.601634");
        String s = HttpUtil.sendHttpsPost("https://api.map.baidu.com/reverse_geocoding/v3", null, JSONObject.toJSONString(obj));
        JSONObject jsonObject = JSONObject.parseObject(s);
        String addressByXY = getAddressByXY("31.351837", "121.601634");
//        System.out.println(getLngLat("上海海潮路133号1167铺"));
//        System.out.println(getDistance(31.226443,121.444906,40.058359,116.307629)+"km");
    }
}
